.\"  Copyright (c) 20002 Sun Microsystems, Inc.
.\"  All Rights Reserved.
.\"  Copyright 2018, Joyent, Inc.
.\" The contents of this file are subject to the terms of the
.\" Common Development and Distribution License (the "License").
.\" You may not use this file except in compliance with the License.
.\"
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
.\" or http://www.opensolaris.org/os/licensing.
.\" See the License for the specific language governing permissions
.\" and limitations under the License.
.\"
.\" When distributing Covered Code, include this CDDL HEADER in each
.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
.\" If applicable, add the following below this CDDL HEADER, with the
.\" fields enclosed by brackets "[]" replaced with your own identifying
.\" information: Portions Copyright [yyyy] [name of copyright owner]
.Dd August 31, 2018
.Dt PRNIO 4I
.Os
.Sh NAME
.Nm prnio
.Nd generic printer interface
.Sh SYNOPSIS
.In sys/prnio.h
.Sh DESCRIPTION
The
.Nm
generic printer interface defines ioctl commands and data
structures for printer device drivers.
.Pp
.Nm
defines and provides facilities for five basic phases of the printing process:
.Bl -bullet -offset indent
.It
Identification \(em Retrieve device information/attributes
.It
Setup \(em Set device attributes
.It
Transfer \(em Transfer data to or from the device
.It
Cleanup \(em Transfer phase conclusion
.It
Abort \(em Transfer phase interruption
.El
.Pp
During the Identification phase, the application retrieves a set of device
capabilities and additional information using the
.Dv PRNIOC_GET_IFCAP ,
.Dv PRNIOC_GET_STATUS ,
.Dv PRNIOC_GET_TIMEOUTS ,
.Dv PRNIOC_GET_IFINFO ,
and
.Dv PRNIOC_GET_1284_DEVID
commands.
.Pp
During the Setup phase the application sets some interface attributes and
probably resets the printer as described in the
.Dv PRNIOC_SET_IFCAP ,
.Dv PRNIOC_SET_TIMEOUTS ,
and
.Dv PRNIOC_RESET
sections.
.Pp
During the Transfer phase, data is transferred in a forward (host to
peripheral) or reverse direction (peripheral to host).
Transfer is accomplished
using
.Xr write 2
and
.Xr read 2
system calls.
For
.Nm
compliant
printer drivers, forward transfer support is mandatory, while reverse transfer
support is optional.
Applications can also use
.Dv PRNIOC_GET_STATUS
and
.Dv PRNIOC_GET_1284_STATUS
commands during the transfer to monitor the device state.
.Pp
The Cleanup phase is accomplished by closing the device using
.Xr close 2 .
Device drivers supporting
.Nm
may set non-zero error code as appropriate.
Applications should explicitly
.Xr close 2
a device before
exiting and check
.Va errno
value.
.Pp
The Abort phase is accomplished by interrupting the
.Xr write 2
and
.Xr read 2
system calls.
The application can perform some additional cleanup
during the Abort phase as described in
.Dv PRNIOC_GET_IFCAP
section.
.Sh IOCTLS
.Bl -tag -width PRNIOC_GET_IFINFO
.It Dv PRNIOC_GET_IFCAP
Application can retrieve printer interface capabilities using this command.
The
.Xr ioctl 2
argument is a pointer to
.Vt uint_t ,
a bit field representing
a set of properties and services provided by a printer driver.
Set bit means supported capability.
The following values are defined:
.Bl -tag -width PRN_1284_STATUS
.It Dv PRN_BIDI
When this bit is set, the interface operates in a
bidirectional mode, instead of forward-only mode.
.It Dv PRN_HOTPLUG
If this bit is set, the interface allows device hot-plugging.
.It Dv PRN_1284_DEVID
If this bit is set, the device is capable of returning
.Em 1284
device ID (see
.Dv PRNIOC_GET_1284_DEVID ) .
.It Dv PRN_1284_STATUS
If this bit is set, the device driver can return device
status lines (see
.Dv PRNIOC_GET_1284_STATUS ) .
Some devices support this
ioctl in unidirectional mode only.
.It Dv PRN_TIMEOUTS
If this bit is set the peripheral may stall during the
transfer phase and the driver can timeout and return from the
.Xr write 2
and
.Xr read 2
returning the number of bytes that have been transferred.
If
.Dv PRN_TIMEOUTS
is set, the driver supports this functionality and the
timeout values can be retrieved and modified via the
.Dv PRNIOC_GET_TIMEOUTS
and
.Dv PRNIOC_SET_TIMEOUTS
ioctls.
Otherwise, applications can implement
their own timeouts and abort phase.
.It Dv PRN_STREAMS
This bit impacts the application abort phase behaviour.
If the device claimed
.Dv PRN_STREAMS
capability, the application must issue an
.Dv I_FLUSH
.Xr ioctl 2
before
.Xr close 2
to dismiss the untransferred
data.
Only STREAMS drivers can support this capability.
.El
.It Dv PRNIOC_SET_IFCAP
This ioctl can be used to change interface capabilities.
The argument is a pointer to
.Vt uint_t
bit field that is described in detail in the
.Dv PRNIOC_GET_IFCAP
section.
Capabilities should be set one at a time;
otherwise the command will return
.Er EINVAL .
The following capabilities can be changed by this ioctl:
.Bl -tag -width PRN_BIDI
.It Dv PRN_BIDI
When this capability is set, the interface operates in a
bidirectional mode, instead of forward-only mode.
Devices that support only one
mode will not return error; applications should use
.Dv PRNIOC_GET_IFCAP
to check if the mode was successfully changed.
Because some capabilities may be
altered as a side effect of changing other capabilities, this command should be
followed by
.Dv PRNIOC_GET_IFCAP .
.El
.It Dv PRNIOC_GET_IFINFO
This command can be used to retrieve printer interface info string, which is an
arbitrary format string usually describing the bus type.
The argument is a
pointer to
.Vt struct prn_interface_info
as described below.
.Bd -literal -offset 2n
struct prn_interface_info {
  uint_t	  if_len;   /* length of buffer */
  uint_t	  if_rlen;  /* actual info length */
  char   *if_data;          /* buffer address */
};
.Ed
.Pp
The application allocates a buffer and sets
.Fa if_data
and
.Fa if_len
values to its address and length, respectively.
The driver returns the string
to this buffer and sets
.Fa if_len
to its length.
If
.Fa if_len
is less
than
.Fa if_rlen ,
the driver must return the first
.Fa if_len
bytes of the string.
The application may then repeat the command with a bigger buffer.
.Pp
Although
.Nm
does not limit the contents of the interface info string,
some values are recommended and defined in
.In sys/prnio.h
by the following macros:
.Pp
.Bl -tag -width PRN_PARALLEL -compact
.It Dv PRN_PARALLEL
Centronics or
.Em IEEE 1284
compatible devices
.It Dv PRN_SERIAL
EIA-232/EIA-485 serial ports
.It Dv PRN_USB
Universal Serial Bus printers
.It Dv PRN_1394
.Em IEEE 1394
peripherals
.El
.Pp
Printer interface info string is for information only: no implications should
be made from its value.
.It Dv PRNIOC_RESET
Some applications may want to reset the printer state during Setup and/or
Cleanup phase using
.Dv PRNIOC_RESET
command.
Reset semantics are
device-specific, and in general, applications using this command should be
aware of the printer type.
.Pp
Each
.Nm
compliant driver is required to accept this request, although
performed actions are completely driver-dependent.
More information on the
.Dv PRNIOC_RESET
implementation for the particular driver is available in the
corresponding man page and printer manual.
.It Dv PRNIOC_GET_1284_DEVID
This command can be used to retrieve printer device ID as defined by
.Em IEEE 1284-1994 .
The
.Xr ioctl 2
argument is a pointer to
.Vt struct prn_1284_device_id
as described below.
.Bd -literal -offset 2n
struct prn_1284_device_id {
   uint_t	  id_len;   /* length of buffer */
   uint_t	  id_rlen;  /* actual ID length */
   char           *id_data; /* buffer address */
};
.Ed
.Pp
For convenience, the two-byte length field is not considered part of device ID
string and is not returned in the user buffer.
Instead,
.Fa id_rlen
value shall be set to (length - 2) by the driver, where length is the ID
length field value.
If buffer length is less than
.Fa id_rlen ,
the driver returns the first
.Fa id_len
bytes of the ID.
.Pp
The printer driver must return the most up-to-date value of the device ID.
.It Dv PRNIOC_GET_STATUS
This command can be used by applications to retrieve current device status.
The argument is a pointer to
.Vt uint_t ,
where the status word is returned.
Status is a combination of the following bits:
.Bl -tag -width PRN_ONLINE
.It Dv PRN_ONLINE
For devices that support
.Dv PRN_HOTPLUG
capability, this bit is set when the device is online, otherwise the device is
offline.
Devices without
.Dv PRN_HOTPLUG
support should always have this bit set.
.It Dv PRN_READY
This bit indicates if the device is ready to receive/send data.
Applications may use this bit for an outbound flow control.
.El
.It Dv PRNIOC_GET_1284_STATUS
Devices that support
.Dv PRN_1284_STATUS
capability accept this ioctl to
retrieve the device status lines defined in
.Em IEEE 1284
for use in Compatibility mode.
The following bits may be set by the driver:
.Pp
.Bl -tag -width PRN_1284_NOFAULT -compact
.It Dv PRN_1284_NOFAULT
Device is not in error state
.It Dv PRN_1284_SELECT
Device is selected
.It Dv PRN_1284_PE
Paper error
.It Dv PRN_1284_BUSY
Device is busy
.El
.It Dv PRNIOC_GET_TIMEOUTS
This command retrieves current transfer timeout values for the driver.
The argument is a pointer to
.Vt struct prn_timeouts
as described below.
.Bd -literal -offset 2n
struct prn_timeouts {
    uint_t tmo_forward; /* forward transfer timeout */
    uint_t tmo_reverse; /* reverse transfer timeout */
};
.Ed
.Pp
.Fa tmo_forward
and
.Fa tmo_reverse
define forward and reverse transfer timeouts in seconds.
This command is only valid for drivers that support
.Dv PRN_TIMEOUTS
capability.
.It Dv PRNIOC_SET_TIMEOUTS
This command sets current transfer timeout values for the driver.
The argument is a pointer to
.Vt struct prn_timeouts .
See
.Sx PRNIOC_GET_TIMEOUTS
for description of this structure.
This command is only valid for drivers that support
.Dv PRN_TIMEOUTS
capability.
.El
.Sh SEE ALSO
.Xr close 2 ,
.Xr ioctl 2 ,
.Xr read 2 ,
.Xr write 2 ,
.Xr ecpp 4D ,
.Xr lp 4D ,
.Xr usbprn 4D ,
.Xr attributes 7
.Rs
.%T IEEE Std 1284-1994
.Re
